#include "lista.hh"

Lista::Lista(){
  primeiro = ultimo = atual = NULL; 
}

bool Lista::estaVazio(){
  return primeiro == NULL; 
}

int Lista::comprimento(){
  int comprimento;
  atual = primeiro;
  while(atual){
    comprimento++;
    atual = atual->proximo; 
  }
  return comprimento; 
}

void Lista::inserePrimeiro(Elemento* novo){
  if(estaVazio())
    primeiro = ultimo = atual = novo;
  else {
    novo->proximo = primeiro;
    primeiro = novo; 
  }
}

void Lista::insereUltimo(Elemento* novo){
  if(estaVazio())
    primeiro = ultimo = atual = novo;
  else {
    ultimo->proximo = novo;
    ultimo = novo; 
  }
}

void Lista::moveParaPosicao(int posicao){
  atual = primeiro;
  for(int i = 0; i < posicao; ++i)
    atual = atual->proximo; 
}

void Lista::insereNaPosicao(Elemento* novo, int posicao){
  moveParaPosicao(posicao);
  novo->proximo = atual->proximo;
  atual->proximo = novo; 
}

Elemento* Lista::retornaPrimeiro(){
  return primeiro; 
}

Elemento* Lista::retornaUltimo(){
  return ultimo; 
}

Elemento* Lista::elementoNaPosicao(int posicao){
  moveParaPosicao(posicao);
  return atual; 
}

int Lista::buscaElemento(Elemento* elemento){
  int cont = 0;
  atual = primeiro;

  while(atual && atual != elemento){
    atual = atual->proximo;
    cont++;
  }

  if(atual)
    return cont;
  else
    return -1; 
}

void Lista::removePrimeiro(){
  primeiro = primeiro->proximo;
}

void Lista::removeUltimo(){
  int posicao;
  posicao = comprimento() - 1;
  moveParaPosicao(posicao);
  atual->proximo = NULL;
  ultimo = atual; 
}

void Lista::removeElemento(Elemento* elemento){
  Elemento* temp;
  int posicao = buscaElemento(elemento);
  if(posicao > -1){
    temp = atual->proximo;
    posicao = posicao - 1;
    moveParaPosicao(posicao);
    atual->proximo = temp; 
  }
}

void Lista::removeNaPosicao(int posicao){
  Elemento* temp;
  moveParaPosicao(posicao);
  temp = atual->proximo;
  posicao = posicao - 1;
  moveParaPosicao(posicao);
  atual->proximo = temp; 
}
